package main

import (
	"controller"
	"github.com/gin-gonic/gin"
	"net/http"
    "middleWare"
    "time"
)

func main() {
	// 创建路由
	r := gin.Default()
	// 注册中间件, 获取用户的登录信息
	r.Use(middleWare.MiddleWare())
	// 测试，路由分组
	testGroup := r.Group("/test")
	{
        // 测试next函数，相当于链式调用， 执行到next行之后会直接跳入下一个中间件
		// 下一个中间件会运行， 运行到next代码行， 以此类推 ， 运行到最后一个中间件的next之后会倒序回去执行
		// 下面的运行结果是：
		/*
			mid1 start
			mid2 start
			mid3 start
			mid3 end
			mid2 end
			mid1 end
		*/
		mid1 := func(c *gin.Context) {
			fmt.Println("mid1 start")
			c.Next()
			fmt.Println("mid1 end")
		}

		mid2 := func(c *gin.Context) {
			fmt.Println("mid2 start")
			c.Next()
			fmt.Println("mid2 end")
		}

		mid3 := func(c *gin.Context) {
			fmt.Println("mid3 start")
			c.Next()
			fmt.Println("mid3 end")
		}
		testGroup.Use(mid1, mid2, mid3)
		testGroup.GET("/user/:name", controller.GinPathParamsTest)
		testGroup.GET("/user", controller.GinUrlParamsTest)
		testGroup.POST("/formData", controller.GinFormDataTest)
		testGroup.POST("/jsonData", controller.GinJsonDataByStructTest)
	}
	// 文件上传下载路由
	fileGroup := r.Group("/file")
	{
		fileGroup.POST("/upload", controller.UploadFile)
		fileGroup.POST("/downFile", controller.DownloadFile)
		fileGroup.POST("/uploadMulti", controller.UploadMultiFiles)
	}

	// todo 补充返回值路由
    // test返回不同的类型的数据
	respGroup := r.Group("/resp")
	{
		respGroup.POST("/struct", controller.RespStructTest)
		respGroup.POST("/xml", controller.RespXmlTest)
		respGroup.POST("/yml", controller.RespYmlTest)
	}

	// 重定向
	r.GET("/reIndex", func(c *gin.Context) {
		c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com/")
	})

	// 测试同步和异步接口
	asyncGroup := r.Group("/async")
	{
		asyncGroup.POST("/async", controller.AsyncReq)
		asyncGroup.POST("/sync", controller.SyncReq)
	}

	// 测试登录获取token，获取token使用上面的统一中间件
    userGroup := r.Group("/user")
    {
		// 在这个案例中 ，可以定义局部的中间件
		userGroup.POST("/login", func(context *gin.Context) {
			fmt.Println("login 局部中间件...")
		}, controller.Login)
	}

    // 测试函数消费时间
	funcCostGroup := r.Group("/funcCost")
	{
		// 针对这一个组的路由使用一个中间件
		funcCostGroup.Use(middleWare.FuncCostTime())
		funcCostGroup.POST("/test", func(context *gin.Context) {
			// 定义一个局部的中间件， 在方法中休眠3秒，最后输出如下。
			// 输出结果如下
			// 2024/05/08 10:22:28 进入统计时间中间件... 开始计时！
			// 2024/05/08 10:22:31 方法消耗时间= 3.0132028s
			time.Sleep(3 * time.Second)
			context.JSON(200, gin.H{
				"code": 200,
				"msg":  "success",
			})
		})
	}

	// 测试cookie
	cookieGroup := r.Group("/cookie")
	{
		cookieGroup.POST("/test", controller.TestCookie)
	}

	// 里面不指定端口号默认为8080
	r.Run(":8000")
}
